Cum se stocheaza in memoria unui calculator o linie a unui tabel?
R: folosind o structura de date, ce poate stoca date diferite
Aceasta structura poarta numele de inregistrare
Dupa cum se poate observa, o inregistrare are mai multe componente, componente ce poarta numele de campuri, fiecare componenta fiind de alt tip,
O inregistrare poate primi un nume care sa defineasca intreaga inregistrare. In exemplul nostru, am putea alege numele “elev” deoarece toate campurile definesc in totalitatea lor “proprietatile” unui elev. Definitie:O structură este un ansamblu format din una sau mai multedate de tipuri diferitegrupate împreună sub un singur nume. Datele pot fi: -Date elementare: numerice, caracter(int, long, float, char, double)
Ex: varsta unui elev poate fi un numar intreg, inatimea, un numar real; -Structuri de date: vectorii numerici, siruri de caractere (structuri omogene), si inregistrarile (structuri neomogene)
Ex: numele unui elev este un sir de caractere, notele unui elev pot fi stocate intr-un vector numeric, Structurile se deosebesc de tablouri prin următoarele aspecte:
(i) elementele unei structuri pot avea tipuri diferite,(ii) structurile pot fi atribuite,(iii)funcţiile pot returna structuri,(iv) elementele unui structuri nu sunt variabile anonime ci au câte un nume,(v) referirea unui element al unei structuri se realizează cu operatorul de selecţie ( . ) şi nu cu operatorul de indexare ( [ ] ). Forma generala a unei structuri struct[numestructura]
{
[<tip> <numevariabila [, numevariabila, ……]>];
[<tip> <numevariabila [, numevariabila, ……]>];
…
} [lista de variabile];
Definitia structurii FORMA 1 DE DECLARARE
definirea structurii este separata de declararea variabilelor separat definite struct elev{ char nume[20], prenume[20]; float nota_mate,nota_info; int varsta; }; elev x,y;
FORMA 3 DE DECLARARE
structura nu are definit un nume, nu veti putea defini ulterior o alta variabila de memorie cu acest tip; singurele variabile definite sunt x si y. struct { char nume[20], prenume[20]; float nota_mate, nota_info; intvarsta; } x, y;
Accesarea campurilorFiind data o structura elev definita astfel: struct elev{ char nume [20], prenume[20]; float nota_mate,nota_info; int varsta; } popescu;
Vom accesa elementele inregistrarii, folosind operatorul de acesare directa “.”; Astfel vom avea:
popescu.nume reprezinta campul nume al variabilei popescu
popescu.nume[0] reprezinta primul caracter din nume
popescu.nota_mate reprezinta nota la mate a lui popescu
Observatii:
Între două variabile de acelaşi tip struct se poate folosi atribuirea.
Dacă inr1, inr2 sunt două variabile de tip elev, prin atribuirea inr1=inr2, variabila inr1 ia aceeaşi valoare ca variabila inr2.
O astfel de atribuire se mai numeşte copiere bit cu bit.
Exemplul1: Se citeste si se afiseaza o variabila de tip elev #include<iostream>
using namespace std;
struct elev{
char nume [20], prenume[20];
float nota_mate,nota_info;
int varsta;
};
main(){
elev inr;
cout<“Nume “;cin.get(inr.nume,20);cin.get(); cout<<“prenume “;cin.get(inr.prenume,20);
cout<<“nota mate”;cin>>inr.nota_mate;
cout<<“nota info”;cin>>inr.nota_info;
cout<<“varsta”;cin>>inr.varsta;
cout<<“Am citit:”<<endl<< inr.nume<< “ ”<<inr.prenume<<endl<< inr.nota_mate<<endl;
cout<< inr.nota_info<<endl<< inr.varsta;
}
Tema
Cititi o variabila cu urmatoarea structura:
Nume_elev: 30 caractere
Zi: intreg;
Luna : intreg
An: intreg
Nota mate real
Nota info real
Nota engleza real
Media real
OBS!!!!: Media se calculeaza nu se citeste
Lectia 2
In unele cazuri, unul dintre campurile inregistrarii poate fi si el, la randul lui de tip inregistrare.Exemplu- Sa consideram o inregistrare care trebuie sa contina urmatoarele campuri:nume, pren, data_n si salariu, unde data_n este tot de tip inregistrare. Varianta 1:
struct data{
int zi,luna,an;}
struct persoana{
char nume[30],prenume[30];
data data_n;} Varianta 2:
struct persoana{
char nume[30],prenume[30]; struct{int zi,an,luna} data_n;
};
Exemplu de accesarea campurilor:
persoana p; //se declara variabila p de tip persoana
p.nume - campul nume din structura persoana
p.data_n.an - campul an din data nasterii
p.data_n.luna - campul luna din data nasterii
p.data_n.zi - campul zi din data nasterii Problema: Se citesc de la tastatura coordonatele a doua segmente care reprezinta laturile unui dreptunghi(latimea,lungimea). Sa i se calculeze diagonala.
Lectia 3
Vectori de inregistrari Problema 1: Fie urmatoarea structura:
Nume: 30 caractere
Inaltime: numar real
Greutate: numar intreg
Cititi n inregistrari de tipul celei de mai sus si afisati-le in ordine a alfabetica a numelui, fiecare inregistrare pe cate o linie:
Ex: n=2
Ionescu 1.62 70
Antonescu 1.72 80
Se vorafisa:
Antonescu 1.72 80
Ionescu 1.62 70 Rezolvare #include<fstream>
#include<string.h>//cstring
using namespace std;
structelev{
char nume[31];
float h;
int g;} v[10],aux;
int main(){
intn,i,j,x;
ifstream fin("date.in");
ofstreamfout("date.out");
fin>>n;
for(i=0; i<n; i++){
fin>>v[i].nume;
fin>>v[i].h;
fin>>v[i].g; }
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++){
x=strcmp(v[i].nume,v[j].nume);
if(x>0) {
aux=v[i];
v[i]=v[j];
v[j]=aux;
}
}
for(i=0;i<n;i++){
fout<<v[i].nume<<" "<<v[i].h<<" "<<v[i].g<<endl;
}
return 0;
} Problema 2: Fie urmatoarea structura:
Nume: 30 caractere
Prenume: 30 caractere
Inaltime: numar real
Greutate: numar intreg
Cititi n inregistrari de tipul celei de mai sus si afisati-le in ordine descrescatoare dupa campul inaltime, fiecare inregistrare pe cate o linie:
Ex: n=2
IonescuVlad 1.62 70
AntonescuCiprian 1.72 80
Se vorafisa:
AntonescuCiprian 1.72 80
IonescuVlad 1.62 70 Problema 3: Fie urmatoarea structura:
Nume: 30 caractere
Prenume: 30 caractere
medie: numar real
Nota1,nota2: numere intregi
Cititi n inregistrari de tipul celei de mai sus si afisati-le in ordine descrescatoare dupa campul medie, fiecare inregistrare pe cate o linie:
Ex: n=2
AntonescuCiprian 8.50 8 9
IonescuVlad 9.50 10 9
Se vorafisa:
IonescuVlad 9.50 10 9
AntonescuCiprian 8.50 8 9
Lectia 1
Studiu de caz: fie o linie dintr-un tabel
R: folosind o structura de date, ce poate stoca date diferite
Aceasta structura poarta numele de inregistrare
Dupa cum se poate observa, o inregistrare are mai multe componente, componente ce poarta numele de campuri, fiecare componenta fiind de alt tip,
O inregistrare poate primi un nume care sa defineasca intreaga inregistrare. In exemplul nostru, am putea alege numele “elev” deoarece toate campurile definesc in totalitatea lor “proprietatile” unui elev.
Definitie: O structură este un ansamblu format din una sau mai multe date de tipuri diferite grupate împreună sub un singur nume.
Datele pot fi:
-Date elementare: numerice, caracter(int, long, float, char, double)
Ex: varsta unui elev poate fi un numar intreg, inatimea, un numar real;
-Structuri de date: vectorii numerici, siruri de caractere (structuri omogene), si inregistrarile (structuri neomogene)
Ex: numele unui elev este un sir de caractere, notele unui elev pot fi stocate intr-un vector numeric,
Structurile se deosebesc de tablouri prin următoarele aspecte:
(i) elementele unei structuri pot avea tipuri diferite,(ii) structurile pot fi atribuite,(iii)funcţiile pot returna structuri,(iv) elementele unui structuri nu sunt variabile anonime ci au câte un nume,(v) referirea unui element al unei structuri se realizează cu operatorul de selecţie ( . ) şi nu cu operatorul de indexare ( [ ] ).
Forma generala a unei structuri
struct[numestructura]
{
[<tip> <numevariabila [, numevariabila, ……]>];
[<tip> <numevariabila [, numevariabila, ……]>];
…
} [lista de variabile];
Definitia structurii
FORMA 1 DE DECLARARE
definirea structurii este separata de declararea variabilelor separat definite
struct elev{
char nume[20], prenume[20];
float nota_mate,nota_info;
int varsta;
};
elev x,y;
FORMA 2 DE DECLARARE
struct elev{
char nume[20], prenume[20];
float nota_mate, nota_info;
intvarsta;
} x, y;
FORMA 3 DE DECLARARE
structura nu are definit un nume, nu veti putea defini ulterior o alta variabila de memorie cu acest tip; singurele variabile definite sunt x si y.
struct {
char nume[20], prenume[20];
float nota_mate, nota_info;
intvarsta;
} x, y;
Accesarea campurilorFiind data o structura elev definita astfel:
struct elev{
char nume [20], prenume[20];
float nota_mate,nota_info;
int varsta;
} popescu;
Vom accesa elementele inregistrarii, folosind operatorul de acesare directa “.”; Astfel vom avea:
- popescu.nume reprezinta campul nume al variabilei popescu
- popescu.nume[0] reprezinta primul caracter din nume
- popescu.nota_mate reprezinta nota la mate a lui popescu
Observatii:Exemplul1: Se citeste si se afiseaza o variabila de tip elev
#include<iostream>
using namespace std;
struct elev{
char nume [20], prenume[20];
float nota_mate,nota_info;
int varsta;
};
main(){
elev inr;
cout<“Nume “;cin.get(inr.nume,20);cin.get();
cout<<“prenume “;cin.get(inr.prenume,20);
cout<<“nota mate”;cin>>inr.nota_mate;
cout<<“nota info”;cin>>inr.nota_info;
cout<<“varsta”;cin>>inr.varsta;
cout<<“Am citit:”<<endl<< inr.nume<< “ ”<<inr.prenume<<endl<< inr.nota_mate<<endl;
cout<< inr.nota_info<<endl<< inr.varsta;
}
Tema
Cititi o variabila cu urmatoarea structura:
- Nume_elev: 30 caractere
- Zi: intreg;
- Luna : intreg
- An: intreg
- Nota mate real
- Nota info real
- Nota engleza real
- Media real
OBS!!!!: Media se calculeaza nu se citesteLectia 2
In unele cazuri, unul dintre campurile inregistrarii poate fi si el, la randul lui de tip inregistrare.Exemplu- Sa consideram o inregistrare care trebuie sa contina urmatoarele campuri:nume, pren, data_n si salariu, unde data_n este tot de tip inregistrare.
Varianta 1:
struct data{
int zi,luna,an;}
struct persoana{
char nume[30],prenume[30];
data data_n;}
Varianta 2:
struct persoana{
char nume[30],prenume[30];
struct{int zi,an,luna} data_n;
};
Exemplu de accesarea campurilor:
persoana p; //se declara variabila p de tip persoana
p.nume - campul nume din structura persoana
p.data_n.an - campul an din data nasterii
p.data_n.luna - campul luna din data nasterii
p.data_n.zi - campul zi din data nasterii
Problema: Se citesc de la tastatura coordonatele a doua segmente care reprezinta laturile unui dreptunghi(latimea,lungimea). Sa i se calculeze diagonala.
Lectia 3
Vectori de inregistrari
Problema 1: Fie urmatoarea structura:
- Nume: 30 caractere
- Inaltime: numar real
- Greutate: numar intreg
Cititi n inregistrari de tipul celei de mai sus si afisati-le in ordine a alfabetica a numelui, fiecare inregistrare pe cate o linie:Ex: n=2
Ionescu 1.62 70
Antonescu 1.72 80
Se vorafisa:
Antonescu 1.72 80
Ionescu 1.62 70
Rezolvare
#include<fstream>
#include<string.h>//cstring
using namespace std;
structelev{
char nume[31];
float h;
int g;} v[10],aux;
int main(){
intn,i,j,x;
ifstream fin("date.in");
ofstreamfout("date.out");
fin>>n;
for(i=0; i<n; i++){
fin>>v[i].nume;
fin>>v[i].h;
fin>>v[i].g; }
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++){
x=strcmp(v[i].nume,v[j].nume);
if(x>0) {
aux=v[i];
v[i]=v[j];
v[j]=aux;
}
}
for(i=0;i<n;i++){
fout<<v[i].nume<<" "<<v[i].h<<" "<<v[i].g<<endl;
}
return 0;
}
Problema 2: Fie urmatoarea structura:
- Nume: 30 caractere
- Prenume: 30 caractere
- Inaltime: numar real
- Greutate: numar intreg
Cititi n inregistrari de tipul celei de mai sus si afisati-le in ordine descrescatoare dupa campul inaltime, fiecare inregistrare pe cate o linie:Ex: n=2
IonescuVlad 1.62 70
AntonescuCiprian 1.72 80
Se vorafisa:
AntonescuCiprian 1.72 80
IonescuVlad 1.62 70
Problema 3: Fie urmatoarea structura:
- Nume: 30 caractere
- Prenume: 30 caractere
- medie: numar real
- Nota1,nota2: numere intregi
Cititi n inregistrari de tipul celei de mai sus si afisati-le in ordine descrescatoare dupa campul medie, fiecare inregistrare pe cate o linie:Ex: n=2
AntonescuCiprian 8.50 8 9
IonescuVlad 9.50 10 9
Se vorafisa:
IonescuVlad 9.50 10 9
AntonescuCiprian 8.50 8 9
MATERIALE:
-Structuri